import numpy as np
import pandas as pd

# nan = NaN = NAN
data_frame = pd.DataFrame([[1, 2, np.NAN], [3, np.nan, 5], [2, 3, 8]])
print(data_frame)

# info()查看缺失值
print(data_frame.info())

# isnull()、notnull()查看缺失值
print(data_frame.isnull())
print(data_frame.notnull())
# 只要有一个False，就返回False
print(np.all(data_frame.notnull()))
# 只要有一个True，就返回True
print(np.any(data_frame.notnull()))

# 删除缺失值, 以行为单位，有一个NaN则删除整行
print(data_frame.dropna())
# 功能与上述一致，区别是在原对象上做操作
# data_frame.dropna(inplace=True)
# print(data_frame)
# 删除缺失值, 以列为单位，有一个NaN则删除整列; 通过Axis参数控制
print(data_frame.dropna(axis=1))
# 删除缺失值, 以行为单位，所有的都为NaN才删除整行
print(data_frame.dropna(how='all'))

print("*" * 50)

# 缺失值填充
print(data_frame.fillna(100))
# 缺失值填充-使用后一行的值填充，如data_frame[0,2]用data_frame[1,2]填充，data_frame[1,1]用data_frame[2,1]填充
print(data_frame.fillna(method='backfill'))
# 缺失值填充-使用前一行的值填充
print(data_frame.fillna(method='ffill'))
# 缺失值填充-使用前一列的值填充
print(data_frame.fillna(method='ffill', axis=1))

print("*" * 50)

# 非NaN的空值处理
data_frame.replace(to_replace='?', value=np.nan)
data_frame.fillna(100, inplace=True)
